package net.nyancofc.piconnow;

import java.util.ArrayList;
import java.util.List;

import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class PiconNowActivity
	extends Activity {
	    private Intent     serviceIntent;
	    private IPiconNowTwitterPostService binder;
	    private ListView lvLog;

	    ArrayAdapter<String> adapter;

	    ArrayList<String> logList = new ArrayList<String>();

	    private final static String
	    consumerKey   ="04odf886DlLJcDg2wdiqQQ",
	    consumerSecret="SMU8YHHHyjXpvxdzlljCdeloOohGSl2b7RtgnmA4oIw";
		private final String CALLBACKURL="myapp://mainactivity";

		private OAuthProvider            provider;
		private CommonsHttpOAuthConsumer consumer;

	    //アクティビティ起動時に呼ばれる
	    @Override
	    public void onCreate(Bundle bundle) {
	        super.onCreate(bundle);
	        requestWindowFeature(Window.FEATURE_NO_TITLE);
	        // レイアウトをxmlから設定
	        setContentView(R.layout.main);

	        // インスタンスを取得
	        lvLog = (ListView)findViewById(R.id.main_lv_Log);
	        adapter = new ArrayAdapter<String>(this, R.layout.log_list_item, logList);
	        lvLog.setAdapter(adapter);

	        doOauth();

	        //サービスインテントの生成
	        serviceIntent=new Intent();
	        serviceIntent.setClassName("net.nyancofc.piconnow",
	            "net.nyancofc.piconnow.PiconNowTwitterPostService");

	        //サービスの接続
	        if (isServiceRunning("net.nyancofc.piconnow.PiconNowTwitterPostService")) {
	            bindService(serviceIntent,connection,BIND_AUTO_CREATE);
//	            setServiceUI(false);
	        }
	    }

	    // ログの表示更新
	    private void updateLog() {
	    	adapter.notifyDataSetChanged();
	    }

	    //認証
	    private void doOauth() {
	        try {
	            consumer=new CommonsHttpOAuthConsumer(consumerKey,consumerSecret);
	            provider = new DefaultOAuthProvider(
	                "http://twitter.com/oauth/request_token",
	                "http://twitter.com/oauth/access_token",
	                "http://twitter.com/oauth/authorize");

	            //トークンの読み込み
	            SharedPreferences pref=getSharedPreferences(
	                "token",MODE_PRIVATE);
	            String token      =pref.getString("token","");
	            String tokenSecret=pref.getString("tokenSecret","");

	            //認証済み
	            if (token.length()>0 && tokenSecret.length()>0) {
	                consumer.setTokenWithSecret(token,tokenSecret);
	            }
	            //認証処理のためブラウザ起動
	            else {
	                String authUrl=provider.retrieveRequestToken(consumer,CALLBACKURL);
	                this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
	            }
	        } catch (Exception e) {
	            Toast.makeText(this, e.getMessage(),Toast.LENGTH_LONG).show();
	        }
	    }

	    //認証完了時に呼ばれる
	    protected void onNewIntent(Intent intent) {
	        super.onNewIntent(intent);
	        Uri uri=intent.getData();
	        if (uri!=null && uri.toString().startsWith(CALLBACKURL)) {
	            String verifier=uri.getQueryParameter(
	                oauth.signpost.OAuth.OAUTH_VERIFIER);
	            try {
	                provider.retrieveAccessToken(consumer,verifier);

	                //トークンの書き込み
	                SharedPreferences pref=getSharedPreferences(
	                    "token",MODE_PRIVATE);
	                SharedPreferences.Editor editor=pref.edit();
	                editor.putString("token",consumer.getToken());
	                editor.putString("tokenSecret",consumer.getTokenSecret());
	                editor.commit();

	            } catch(Exception e){
	                Log.d("",e.getMessage());
	            }
	        }
	    }

	    //サービスが起動中かどうか
	    private boolean isServiceRunning(String className) {
	        ActivityManager am=(ActivityManager)getSystemService(ACTIVITY_SERVICE);
	        List<ActivityManager.RunningServiceInfo> serviceInfos=
	            am.getRunningServices(Integer.MAX_VALUE);
	        for (int i=0;i<serviceInfos.size();i++) {
	            if (serviceInfos.get(i).service.getClassName().equals(className)) {
	                return true;
	            }
	        }
	        return false;
	    }

	    //サービスコネクション
	    private ServiceConnection connection=new ServiceConnection() {
	        //サービス接続時に呼ばれる
	        public void onServiceConnected(ComponentName name,IBinder service) {
	            binder=IPiconNowTwitterPostService.Stub.asInterface(service);
	        	try {
					binder.setConsumerInfo(consumer.getToken(),
							consumer.getTokenSecret(),
							consumer.getConsumerKey(),
							consumer.getConsumerSecret());
				} catch (RemoteException e) {
					Log.e("error", e.getMessage());
					e.printStackTrace();
				}
	        }

	        //サービス切断時に呼ばれる
	        public void onServiceDisconnected(ComponentName name) {
	            binder=null;
	        }
	    };

		/**
		 * オプションメニューが最初に呼び出されるときに1度だけ実行
		 */
	    @Override
	    public boolean onCreateOptionsMenu(Menu menu) {
	    	menu.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, "サービス開始");
	    	menu.add(Menu.NONE, Menu.FIRST + 2, Menu.NONE, "サービス停止");
	    	menu.add(Menu.NONE, Menu.FIRST + 3, Menu.NONE, "設定");
	    	menu.add(Menu.NONE, Menu.FIRST + 4, Menu.NONE, "ログ表示");

	    	return super.onCreateOptionsMenu(menu);
	    }

	    /**
	     * オプションメニューが表示される度に呼出し
	     */
	    @Override
	    public boolean onPrepareOptionsMenu(Menu menu) {
	    	return super.onPrepareOptionsMenu(menu);
	    }

	    @Override
	    public boolean onOptionsItemSelected(MenuItem item) {
	        boolean ret = true;
	        switch (item.getItemId()) {

	        case Menu.FIRST + 1:
	            ret = true;
	            //サービスの開始
	            startService(serviceIntent);
	            //サービスの接続
	            bindService(serviceIntent,connection,BIND_AUTO_CREATE);
	            break;
	        case Menu.FIRST + 2:
	            ret = true;
	            //サービスの切断
	            unbindService(connection);
	            //サービスの停止
	            stopService(serviceIntent);
	            break;
	        case Menu.FIRST + 3:
	            ret = true;

	            break;
	        case Menu.FIRST + 4:
	            ret = true;
	            if (binder != null) {
		            try {
						binder.checkLogList(logList);
					} catch (RemoteException e) {
						// TODO 自動生成された catch ブロック
						e.printStackTrace();
					}
	            }
	            updateLog();

	            break;
	        default:
	            ret = super.onOptionsItemSelected(item);
	            break;
	        }

	        return ret;

	    }

}